﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace SingleResponsibility
{
    class Program
    {
        /*
         单一职责原则(SRP)：一个类，应该仅有一个引起它变化的原因。
         软件设计的多大数类容,发现职责并把这些职责相互分离。
         如果一个类的修改动机有多个原因就要考虑进行拆分。
             */

        /*
         开放封闭原则：对于拓展开放，对于修改(函数设计)封闭。 
             */

        /*
         依赖倒置：抽象不应该依赖细节，细节应该依赖于抽象
            1、高层模块不应该依赖底层模块。两个都应该依赖于抽象。
            2、抽象不应该依赖细节。细节应该依赖于抽象。
             */

        /*
         里氏代换原则：子类型必须能替换掉他们的父类型。 
            它是 继承是为了复用接口而不是复用实现 的概念延伸.
            继承不是为了使用父类的的具体实现，而是在外部被引用的地方能够用各种子类替换父类。
            外部只关心父类的接口，而不关心具体的细节(是哪个子类)。 也就是说整个系统是基于接
            口构建编程的，而不是基于实现构建。  这就印证了 高层和底层都应该依赖于抽象。

            而要实现这个，就要保证外部的引用应该总是 Func(Parent a) 形式，调用的时候形如 Func(b),
            保证b可以是Parent的任意子类，Func也可正常工作. 也就是说子类应该总是有效实现父类的
            各种接口，抽象子类的时候要有完整的抽象。如果一个子类只有部分特征，那这个子类可能是
            不恰当的。

            是实现开放封闭的重要原则。 而依赖倒置，说是说的高层和底层都应依赖抽象
         */
        static void Main(string[] args)
        {
            Console.WriteLine("SRP 单一职责");
        }
    }
}
